Author:Hongyu Xiao
Graduate Student
University of Illinois at Urbana–Champaign
August, 2020
Modified based on https://github.com/inducer/languages-and-codegen-tutorial
and http://c.biancheng.net/view/2010.html
请联系我!
邮箱是:hongyu.xiao@hotmail.com
标题开头为: PEK_Summer_Question
例如 PEK_Summer_Question anaconda无法下载
Python的变量采用动态形式,并不需要在一开始指定变量的type
先来看一下简单的python表达式
#clear
3*2
查看表达式或者变量的type,使用函数type()
#clear
type(5+3*2)
#clear
5+3.5*2
#clear
type(5+3.5*2)
Strings 一般用单引号或者双引号括起来
#clear
"你好"
string 还可以进行加法和乘法运算
#clear
3 * '哔哩 ' + "北大"
List都是用方括号括起来,用comma进行区隔其中每一个值
#clear
[6, 6, 6]
并且对于list中的每一个元素,他们不需要有同样的type
["奥里给", 666, [.1,.2,.3]]
并且对于list,还是可以使用乘法和加法
["奥",'里','给'] * 4 + [6, 6, 6]
[1,2,3] * 4 + [5, 5, 5]
如果想要进行数学意义上的数组运算的乘法和加法的话,需要借助一个module叫做numpy
#clear
import numpy as np
np.array([1,2,3]) * 4 + np.array([5, 5, 5])
numpy 是我们进行科学计算的非常常用的一个package!
定义一个变量,并且使用它
#clear
VariableBaseLine = 3*2 + 5
#clear
VariableBaseLine
#clear
VariableBaseLine = "哔哩"*3
#clear
VariableBaseLine
我们并不需要声明变量的类型,并且在python中,我们是可以直接改变变量类型的!
变量类型可以随时改变,并不代表没有类型。
#clear
type(VariableBaseLine)
Python 的变量有点像指针
举个例子
Variable_List = [1,2,3]
Variable_List_Second = Variable_List
#clear
Variable_List_Second.append(4)
#clear
Variable_List_Second
#clear
Variable_List
你会发现,随着Variable_List_Second变化,原变量也发生了变化!
你可以用id()去查看变量的地址
#clear
print(id(Variable_List), id(Variable_List_Second))
这俩地址是一模一样的!
我们来测试一下变量的是否是同一个
#clear
Variable_List is Variable_List_Second
这个地方一定要多加注意,这个要比值相等要更高一级。
Variable_List = [1,2,3]
Variable_List_Second = [1,2,3]
print("IS ", Variable_List is Variable_List_Second)
print("EQUAL", Variable_List == Variable_List_Second)
看了上面的例子,我们来推测一下下面的这个结果
#clear
Variable_List = [1,2,3]
Variable_List_Second = Variable_List
Variable_List = Variable_List + [4]
print(Variable_List_Second)
Variable_List is Variable_List_Second
为什么会出现这个结果?
我们来查看一下下面的例子,列出来各个变量的储存地址
#clear
Variable_List = [1,2,3]
Variable_List_Second = Variable_List
print(id(Variable_List), id(Variable_List_Second))
print ("********************")
Variable_List = Variable_List + [4]
print(Variable_List_Second)
print(id(Variable_List), id(Variable_List_Second))
print ("********************")
你会发现因为动态类型,所以list内容是可以被更改的!
这也是为什么在python里面有一个类型叫做tuple,tuple就是无法更改元素的list!
Variable_List = [1,2,3]
type(Variable_List)
#clear
Variable_List = (1,2,3)
type(Variable_List)
如果你试图去改变tuple的话....
#clear
Variable_List[2] = 0
你就会得到一个错误信息了
如果你有一个元素,但是你想创建一个tuple该怎么办?
#clear
Variable_List = (3,)
type(Variable_List)
我们常用的range
函数可以直接创建一个数字的list
#clear
list(range(10, 20))
Python的index是从0开始的!!
Python的index是从0开始的!!
Python的index是从0开始的!!
Variable_List = list(range(10, 20))
type(Variable_List)
#clear
Variable_List[0]
#clear
Variable_List[1]
#clear
Variable_List[5]
你还可以使用负数
#clear
Variable_List[-1]
#clear
Variable_List[-2]
你还可以抽取list其中的一部分
#clear
Variable_List[3:7]
对于这种截取,并不一定要指定开头和结尾
#clear
Variable_List[3:]
#clear
Variable_List[:7]
print(Variable_List[:3])
print(Variable_List[3])
Python的index是包含前面,不包含后面的!
不仅如此,slicing在python中可以应用到任何的类型里面! (list, tuple, str, numpy array)
Variable_Title = "北京大学暑期学校"
Variable_Title[-3:]
python中的for循环会遍历list
#clear
for i in range(10):
print(i)
if/else
的基本语法也类似
例子如下
for i in range(10):
if i % 3 == 0:
print("{0} 可以被3整除 ".format(i))
else:
print("{0} 不可以被3整除".format(i))
类似的还有 while
循环
例子如下
i = 0
while True:
i += 1
if i**3 + i**2 + i + 1 == 3616:
break
print("答案:", i)
创建list的时候,有时候代码会有点长
比如我们想要创建一个list包含50以内能被7整除的整数的平方
#clear
mylist = []
for i in range(50):
if i % 7 == 0:
mylist.append(i**2)
mylist
Python 支持list缩略创建
具体语法如下
#clear
mylist = [i**2 for i in range(50) if i % 7 == 0]
mylist
我们一般使用function减少我们重复使用的部分代码
下面以创建print_greeting()为例进行说明
def print_greeting():
print("哎呀妈呀,你最近咋样?")
print("好久不见啊")
然后使用这个函数
print_greeting()
现在这个写法没有输入输出,我们可以让这个函数更有人情味一点。
#clear
def print_greeting(name="老哥"):
print("哎呀妈呀, {0}, 你最近咋样?".format(name))
print("好久不见啊")
print_greeting("蔡徐坤")
print()
print_greeting()
这样看起来是不是就更亲近一点了? :)
function的参数可以作为变量
比如下面个例子
def my_func(my_list):
my_list.append(5)
List_Inital = [1,2,3]
my_func(List_Inital)
print(List_Inital)
不仅如此,还可以function还可以返回一定的值
比如下面的例子
#clear
def my_func_2(my_list):
return my_list + [5]
List_Inital = [1,2,3]
List_Inital_2 = my_func_2(List_Inital)
print(List_Inital)
print(List_Inital_2)
将大量的重复模块进行函数化是我们在python编程中常用的方法之一
在python中,所有的都是Object
定义一个Object非常容易:
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def fire(self):
self.salary = 0
在class里面的function称为'methods'
他们一般有一个明确的self parameter, 我们可以使用这个self parameter去构建object
init 就是这个基本构建
这么说起来可能有些模糊
下面给出例子
老张 = Employee("老张", 100000)
老张.name
我们建立一个一个object,老张
老张有俩基本信息,姓名和工资
#clear
老张.salary
老张被建立的时候,这个里头还有一个method叫做fire
下面我们开除老张
#clear
老张.fire()
#clear
老张.salary
可以看到,老张的工资成了0。
Type可以从其他的Type去继承属性
class Boss(Employee):
def __init__(self, name, salary, supervises):
super(Boss, self).__init__(name, salary)
self.supervises = supervises
def fire(self):
for s in self.supervises:
s.fire()
super(Boss, self).fire()
老张 = Employee("老张", 100000)
老王 = Employee("老王", 100000)
李老板 = Boss("老李", 150000, [老张, 老王])
李老板.salary
如果我们开除老李呢?
#clear
李老板.fire()
#clear
老张.salary
:)